package com.cskaoyan.javase._2inner._3local._1basic;

/**
 * 在说明以下访问特点之前,我们要明确两个点:
 *      1.局部内部类仅在定义它的作用域内部生效,这意味着即便是外围类
 *          也不能任意访问它
 *          只能在作用域内部去访问/使用它
 *
 *      2.内部类和外围类是"好兄弟"的原则,在局部内部类中发生了改变:
 *          局部内部类仍然可以无条件访问外围类(不受限制)
 *          外围类只能在作用域内部访问,作用域之外是不能直接访问这个局部内部类的
 *
 *局部内部类的访问特点，我们仍然主要从以下几个角度研究：
 *      1.局部内部类内部访问外围类(重点)
 *          可以正常访问,并且局部内部类没有静态声明
 *          所以只能在成员方法中访问外围类
 *
 *          (重点)局部内部类处在外围类的不同方法时,效果是不同的:
 *              a.外围类静态方法中的局部内部类
 *                  就是一个单纯的内部类,和外围类对象之间没有任何关系(类似于静态内部类)
 *
 *              b.外围类成员方法中的局部内部类
 *                  这时局部内部类对象,会持有外围类对象的引用,作为它的成员变量(类似于成员内部类)
 *
 *      2.外围类访问局部内部类成员(一般)
 *          在作用域内部创建对象,可以无条件访问
 *          作用域之外不能直接访问局部内部类
 *
 *      3.外部类访问局部内部类成员(了解)
 *          外部类肯定无法直接访问局部内部类
 *      4.局部内部类访问外部类成员(了解)
 *          可以访问,创建对象,受权限限制
 *
 * 以上语法,1是相对比较重要的,但是总体而言,都不是很常用.
 *
 * @since 17:28
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        /*EnclosedClazz ec = new EnclosedClazz();
        ec.test();*/

        EnclosedClazz.testStatic();
    }
}

class EnclosedClazz {
    int a;
    private int b = 10;
    int c;

    // 外围类的成员方法的局部位置
    public void test() {
        // 局部内部类
        class Inner {
            // 局部内部类的成员变量
            int a;
            private int b = 10;
            int c;

            /*
                外围类的成员方法中,的局部内部类的,成员方法
                这里存在两个对象
                一个是this指向当前自身内部类对象
                二是外围类类名.this指向外围类对象

                这时局部内部类可以当成成员内部类使用.
             */
            public void testInner(int c) {
                System.out.println(a);
                System.out.println(b);
                System.out.println(EnclosedClazz.this.a);
                System.out.println(EnclosedClazz.this.b);
                System.out.println(c);
                System.out.println(this.c);
                System.out.println(EnclosedClazz.this.c);
            }
        }
        Inner inner = new Inner();
        inner.testInner(100);
    }

    // 外围类的静态成员方法的局部位置
    public static void testStatic() {
        // 局部内部类
        class Inner {
            // 局部内部类的成员变量
            int a;
            private int b = 10;
            int c;

            /*
                外围类的静态成员方法中,的局部内部类的,成员方法
                只有this指向当前对象,没有外围类对象
             */
            public void testInner() {
                System.out.println(a);
                System.out.println(b);
                System.out.println(c);
                // System.out.println(EnclosedClazz.this.a);
            }
        }
        Inner in = new Inner();
        in.testInner();
    }
}